package swimv2gm.bl.session;

import java.util.List;

import javax.ejb.Remote;

import swimv2gm.bl.domain.Friendship;
import swimv2gm.bl.domain.User;
import swimv2gm.bl.util.UserData;

/**
 * Gestore delle richieste di amicizia.
 * 
 * @author Gallesio Matteo
 */
@Remote
public interface FriendshipManager {

	public Friendship findFriendship(long mitt, long dest);
	
	/**
	 * Aggiunge una nuova richiesta di amicizia.
	 * 
	 * @param mitt
	 *            l'id del mittente
	 * @param dest
	 *            l'id del destinatario
	 * @return <code>true</code> se l'inserimento ha avuto successo,
	 *         <code>false</code> se si sono verificati errori.
	 */
	public boolean addRequest(long mitt,long dest);

	/**
	 * Accetta o rifiuta una richiesta di amicizia. Una richiesta accettata è
	 * marcata come tale, mentre una richiesta rifiutata è rimossa
	 * completamente.
	 * 
	 * @param mitt
	 *            l'id del mittente
	 * @param dest
	 *            l'id del destinatario
	 * @param accepted
	 *            <code>true</code> se la richiesta è accettata,
	 *            <code>false</code> se è rifiutata
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti
	 */
	public boolean processRequest(long mitt,long dest,boolean accepted);

	/**
	 * Fornisce una lista di tutti gli amici di un utente. Due utenti sono amici
	 * se esiste una riga dove uno è il mittente, l'altro è il destinatario e la
	 * richiesta è accettata. (L'ordine di mittente e destinatario è
	 * irrilevante.)
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @return la lista degli amici
	 */
	public List<User> getFriends(long uid);

	/**
	 * Fornisce una lista delle richieste di amicizia non ancora accettate
	 * inviate o ricevute dall'utente.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @param received
	 *            <code>true</code> se si cercano le richieste ricevute,
	 *            <code>false</code> se si richiedono quelle inviate.
	 * @return la lista di utenti
	 */
	public List<User> getPendingFriends(long uid,boolean received);

	/**
	 * Rimuove una relazione di amicizia tra due utenti, accettata o meno.
	 * 
	 * @param u1
	 *            uno dei due utenti
	 * @param u2
	 *            l'altro utente
	 * @return <code>true</code> se l'operazione ha avuto successo,
	 *         <code>false</code> altrimenti
	 */
	public boolean removeFriendship(long u1,long u2);

	/**
	 * Cerca tra gli amici di un utente quelli che hanno dichiarato una
	 * determinata competenza.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @param cid
	 *            l'id della competenza
	 * @return l'elenco di utenti, eventualmente vuoto
	 */
	public List<UserData> friendsWithAbility(long uid,long cid);

	/**
	 * Fornisce id, nome e cognome degli utenti che hanno inviato/ricevuto una
	 * richiesta di amicizia non ancora accettata all'utente dato.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @param received
	 *            <code>true</code> se si cercano le richieste ricevute,
	 *            <code>false</code> se si richiedono quelle inviate.
	 * @return la lista di utenti in formato ridotto
	 * @see UserData
	 */
	public List<UserData> getPendingFriendsData(long uid,boolean received);

	/**
	 * Fornisce id, nome e cognome degli amici dell'utente dato.
	 * 
	 * @param uid
	 *            l'id dell'utente
	 * @return la lista di utenti in formato ridotto
	 * @see UserData
	 */
	public List<UserData> getFriendsData(long uid);

}
